iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

在前一篇文章中,我們簡要介紹了 Gin 框架,以及如何使用。今天我們將建立一個 RESTful API。

RESTful API

RESTful API 是一種基於 REST 架構風格設計的應用程式介面,用於在不同的軟體系統之間進行通信。REST(Representational State Transfer)是一種軟體設計風格,強調資源的狀態以及通過 URL、HTTP 方法(GET、POST、PUT、DELETE 等)和狀態碼來對這些資源執行操作。

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type Todo struct {
	ID    string `json:"id"`
	Title string `json:"title"`
}

var todos []Todo

func main() {
	r := gin.Default()

	r.GET("/todos", GetTodos)
	r.GET("/todos/:id", GetTodo)
	r.POST("/todos", CreateTodo)
	r.PUT("/todos/:id", UpdateTodo)
	r.DELETE("/todos/:id", DeleteTodo)

	r.Run(":8080")
}

func GetTodos(c *gin.Context) {
	c.JSON(http.StatusOK, todos)
}

func GetTodo(c *gin.Context) {
	id := c.Param("id")
	for _, todo := range todos {
		if todo.ID == id {
			c.JSON(http.StatusOK, todo)
			return
		}
	}
	c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}

func CreateTodo(c *gin.Context) {
	var todo Todo
	if err := c.BindJSON(&todo); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"})
		return
	}
	todo.ID = GenerateID()
	todos = append(todos, todo)
	c.JSON(http.StatusCreated, todo)
}

func UpdateTodo(c *gin.Context) {
	id := c.Param("id")
	var updatedTodo Todo
	if err := c.BindJSON(&updatedTodo); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"message": "Invalid JSON"})
		return
	}
	for i, todo := range todos {
		if todo.ID == id {
			todos[i] = updatedTodo
			c.JSON(http.StatusOK, updatedTodo)
			return
		}
	}
	c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}

func DeleteTodo(c *gin.Context) {
	id := c.Param("id")
	for i, todo := range todos {
		if todo.ID == id {
			todos = append(todos[:i], todos[i+1:]...)
			c.JSON(http.StatusNoContent, nil)
			return
		}
	}
	c.JSON(http.StatusNotFound, gin.H{"message": "Todo not found"})
}

func GenerateID() string {
	// 這裡可以使用一個簡單的方式生成唯一 ID,例如使用時間戳記
	return "todo" + time.Now().Format("20060102150405")
}
[GET] localhost:8080/todos/

https://ithelp.ithome.com.tw/upload/images/20230929/20148157peVUimGdQh.png

[POST] localhost:8080/todos

https://ithelp.ithome.com.tw/upload/images/20230929/20148157cQ7eDNn1rU.png

[GET] localhost:8080/todos/

https://ithelp.ithome.com.tw/upload/images/20230929/20148157AkB8WpZhnC.png

[PUT] localhost:8080/todos/todo20230929163805

https://ithelp.ithome.com.tw/upload/images/20230929/20148157qCpu99c5ip.png

[GET] localhost:8080/todos

https://ithelp.ithome.com.tw/upload/images/20230929/20148157HDLvnRQgco.png

[DELETE] localhost:8080/todos/123

https://ithelp.ithome.com.tw/upload/images/20230929/20148157byFyGmhpRQ.png

[GET] localhost:8080/todos/123

https://ithelp.ithome.com.tw/upload/images/20230929/20148157tokhuGbxr8.png

https://ithelp.ithome.com.tw/upload/images/20230929/201481572kz7EVBeic.png

碎語

今天實作簡單的 RESTful API


上一篇
13 | 你怎麼玩 LEGO 的
下一篇
15 | simple middlweare
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言